# 类的成员包括属性和方法
# 1.属性
# ①类属性
# 声明在类内部,方法外部的属性
# 注意：类属性可以通过类或对象进行访问,但只能通过类进行修改
class Car:
    wheels = 4  # 类属性


jeep = Car()
print(jeep.wheels)  # 4
print(Car.wheels)
Car.wheels = 5  # 4
print(jeep.wheels)  # 5
print(Car.wheels)  # 5
jeep.wheels = 6
print(jeep.wheels)  # 6
print(Car.wheels)  # 5


# ②实例属性
# 实例属性是在方法内部声明的属性，支持动态添加
# 访问实例属性:
# 实例属性只能通过对象进行访问,不能通过类进行访问
class Animal:
    def eat(self):
        self.food = "苹果"  # 添加实例属性


human = Animal()
human.eat()
print(human.food)
# 修改实例属性:
# 实例属性通过对象进行修改
human.food = "香蕉"
print(human.food)

# 动态添加实例属性
human.drink = "水"
print(human.drink)


# 2.方法
# ①实例方法
# 实例方法中的self参数代表对象本身，可以通过self调用类属性和实例方法
# 实例方法只能通过对象调用,不能通过对象调用
class Dog:
    food = "骨头"

    def eat(self):  # 定义一个实例方法eat
        print("狗吃", self.food)


keji = Dog()
keji.eat()  # 狗吃 骨头


# Dog.eat()   # 报错

# ②类方法
# 类方法是定义在类内部，使用装饰器classmethod修饰的方法
# 语法：@classmethod
#      def 类方法名 (cls):
#          方法体
# cls：代表类本身，可以通过cls访问和修改类属性的值
# 类方法可以通过类和对象调用

class Cat:
    name = "小花猫"

    @classmethod
    def cry(cls):
        print(f'{cls.name}喵喵')
        cls.name = "加菲猫"
        print(f"{cls.name}要吃披萨")


c1 = Cat()
c1.cry()
Cat.cry()


# 静态方法
# 静态方法定义在类的内部，使用装饰器@staticmethod修饰的方法
# 静态方法没有任何参数(即无self,cls)    无法直接访问属性或方法
# 静态方法可以通过类和对象调用
# 语法：@stasticmethod
#       def 静态方法名():
#           方法体
class Snake:
    @staticmethod
    def eat():
        print("我是静态方法")


s1 = Snake()
s1.eat()
Snake.eat()


# 3.私有方法
# 私有属性  __属性名
# 私有方法  __方法名
# 私有属性和私有方法只能在类内部访问，但可以在类外部通过公有方法进行访问
# 不支持继承
class Pag:
    __name = "小肥猪"

    def __eat(self):
        print(f'{self.__name}爱吃饭')

    def test(self):
        print(self.__name)
        self.__eat()


p1 = Pag()
# p1.__name 报错
p1.test()  # 私有属性通过成员方法进行访问
